package com.manager.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.manager.dao.*;
import com.manager.entity.*;
import com.manager.service.PetService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class PetServiceImpl implements PetService {
    @Autowired
    private PetdetailsMapper petdetailsMapper;
    @Autowired
    private PetreleaseMapper petreleaseMapper;
    @Autowired
    private PettradingMapper pettradingMapper;
    /*先插入一次。*/
    @Autowired
    private com.manager.dao.pettradinglistMapper pettradinglistMapper;
    @Autowired
    private SpeciesMapper speciesMapper;

    @Override
    public String petreleaseaction(String storeid, String petname, String petphotopath, boolean gender, int age, String health, String species, int money) {
        /*注意：里面的异常用不到。*/


        /*返回值集合的成功标志。*/
        int i;
        int j = 0;
        int k;
        int l;
        int m;
        try {
            i = speciesMapper.selectByName(species);

            /*嵌套。*/
            if (i == 0) {
                //执行插入
                try {
                    j = speciesMapper.insertSelective(new Species(species));
                } catch (Exception e) {
                    e.printStackTrace();
                    return "Exception:speciesMapper.insertSelective(new Species(species))";
                }
            }

            /*能否回滚？*/
            int petid;/*放在try-catch外面*/
            try {
                Petrelease petrelease = new Petrelease(storeid);
                k = petreleaseMapper.insertSelective(petrelease);
                petid = petrelease.getPetid();
            } catch (Exception e) {
                e.printStackTrace();
                return "Exception:petreleaseMapper.insertSelective(new Petrelease(storeid))";
            }

            try {
                l = pettradingMapper.insertSelective(new Pettrading(petid, money));
            } catch (Exception e) {
                return "Exception:pettradingMapper.insertSelective(new Pettrading(petid,money))";
            }
            /*这里flag默认，petid还需要获得。money输入。*/

            try {
                m = petdetailsMapper.insertSelective(
                        new Petdetails(petid, petname, petphotopath, gender, age, health, species));
            } catch (Exception e) {
                e.printStackTrace();
                return "Exception:";
            }
            /*[只有photo可以为空。]*/
        } catch (Exception e) {
            e.printStackTrace();
            return "Exception:speciesMapper.selectByName(species)";
        }


        /*先插入主表release，再插入trading，在插入details*/
        // : 2019/5/4 检查继承关系。 全部是继承自petrelease【表要统一。】

        return "success:[" + i + "&" + j + "]&" + k + "&" + l + "&" + m;
    }


    /**
     * 根据storeid获取所有，Petshow对象。也就是封装好了的三个表的对象。
     * 请进行封装操作。【这个类终于成功了。就是复合的List-ArrayList，插入了很多的复合类。通过自己】
     * 【单独取出每一个类中的成员，把每一个成员都取出来。放到构造函数，和List中（使用ArrayList）】
     *
     * @param storeid
     * @return
     */
    @Override
    public Map<String, Object> getAllPetInfoByStoreid(String storeid, int page) {
        PageHelper.startPage(page,5);/*页码+条数（写死？）。*/
        /*todo 好了吗？*/
        List<Petrelease> petreleaseList=petreleaseMapper.selectAllByStoreid(storeid);

        /*和模糊相比？只有这个不同，还有那个？分页不需要？？？*/
        /*或者分页怎么弄在一起？？？【？】分页也是一样的？？？除了查询结果不一样？？而结果只是那个主表不一样也就是一句话不一样？？？其他都一样？？？【完全一样？？反正根据一个表，其它表什么的都一样？】*/
        /*那么怎么清楚查询呢？？刷新？？？【？】*/






        /*上面是外面的不同的部分。作为参数传入？？？【效率？高吗？传了一个复杂的对象？？List？】*/
        /*重复部分？？这样可以？？？？【尝试。】*/

        return petInfo(petreleaseList,page);
    }


    /*把那个getAllPetInfoByStoreid里面拿到这里，除了一句话不一样，其他完全一样用在模糊？【？】*/
    /*多余函数可以有？？？这是implement*/
    /*可以被调用了吗？？？？【？】*/
    /*重复代码，。。低效传输？？？【检测。？】*/
    public Map<String, Object> petInfo(List<Petrelease> petreleaseList,int page){
        /*这里需要使用插件分页。而不是这个。【改。放在外面有问题？？】*/



        /*debug发现这个都查出来了。*/
        PageInfo pageInfo=new PageInfo(petreleaseList);
        /*todo 传到前端？【传到Controller？】*/
        /*这个可以和那个分开放？？没问题？？？【测试？？？？】*/


        /*不能直接new List，而应该使用ArrayList或者LinkedList*/

        List<Petshow> petshowList=new ArrayList<>();
        /*这样处理可以吗？是不是可以合并它们几个？？？*/
        for (Petrelease petrelease:petreleaseList){
            /*debug成功发现有进入这个循环。petrelease的值是正确的。*/

            int petid=petrelease.getPetid();
            /*分页需要List。*/
            Petdetails petdetails=petdetailsMapper.selectByPrimaryKey(petid);

            /*这里有一个错误，就是这个是空。也就是数据库插入时有点问题。【？】*/


            /*这里有问题，查出一个空指针异常，所以可能是数据库为空导致的？？？？*/
            /*java.lang.NullPointerException【所以空指针异常是这里的。】*/
            /*把数据库异常数据直接删了。*/

            Pettrading pettrading=pettradingMapper.selectByPrimaryKey(petid);

            /*java.lang.NullPointerException【这里报了一个空指针异常？？？是什么？？？】*/
            petshowList.add(new Petshow(
                    petid,petrelease.getStoreid(),
                    petdetails.getPetname(),petdetails.getPetphotopath(),petdetails.getGender(),petdetails.getAge(),petdetails.getHealth(),petdetails.getSpecies(),
                    petrelease.getReleasetime(),pettrading.getFlag(),pettrading.getMoney()));
            System.out.println();
            /*【这里测试成功了。所以是应该可以了。debug看到了我想要的东西。】*/
            /*对List有了一个清晰的认识。我们需要把List调用它的实现类。*/
        }

        /*boolean addAll(Collection<? extends E> c)
        添加指定 collection 中的所有元素到此列表的结尾，
        顺序是指定 collection 的迭代器返回这些元素的顺序（可选操作）。
        list.addAll(anotherList);
        */


        /*不返回。petshowList返回Map。里面有List？*/
        Map<String,Object> listandpageinfoMap=new HashMap<String, Object>();
        listandpageinfoMap.put("petshowList",petshowList);
        listandpageinfoMap.put("totalPage",pageInfo.getPages());
        listandpageinfoMap.put("pageSize",pageInfo.getPageSize());
        listandpageinfoMap.put("Size",pageInfo.getSize());

        listandpageinfoMap.put("page",pageInfo.getPageNum());/*获取当前页？？？*/

        listandpageinfoMap.put("total",pageInfo.getTotal());/*【没有这个？？（）】*/

        return listandpageinfoMap;
        /*封装，否则，直接PageInfo。*/



        /*这里把几个对象封装起来。是否和Dao层Mapper层有关？？【不太好，毕竟一个Mapper一般对一个表操作。】*/
        /*就写这儿。*/

        /*第一步，先获取所有的Petrelease对象【不可以一条一条，毕竟一个storeid可以有很多petid】，就是可以有每一个的petid，这样就可以根据需要查看详情了。*/
        /*【需要一次性全部刷出来吗？还是点谁？再查询？】*/
//        List<Petrelease> mypetreleaseslist = petreleaseMapper.selectAllByStoreid(storeid, 0, 5);

        /*一对多。拿出来。*/

        /*根据storeid查出所有petid，作为一个List<Petrelease>*/
        /*【自己造一个方法。。。。///】*/
        /*同时拿出petid，进行下面的操作。*/
        /*最后封装起来。*/

        /*还需要对列表进行循环查询？？好烦？【直接？全部取出来？然后按条件查找？？？？】*/

//        List<Pettrading> pettradingList = null;
//        List<Petdetails> petdetailsList = null;
        /*仍然把它放到列表里，确实用了来回反复查询，没办法？三个表，导致的？【无所谓，试一下。毕竟都要取出来。】*/

        /*【这里用几个循环将它们取出来。】*/
//        for (Petrelease petrelease : mypetreleaseslist) {
//            int i=petrelease.getPetid();
//            pettradingList.add(pettradingMapper.selectByPrimaryKey(i));
//            petdetailsList.add(petdetailsMapper.selectByPrimaryKey(i));
//        }
        /*转换思路，把那个改掉，内连接或者什么查询，返回符合对象，构造函数写好即可。？？？就这样？*/
    }

    /*调用这个函数，使得我们可以删除自己想要删除的数据。【】*/
    @Override
    public String deteleaction(Integer petid) {
        int i = petreleaseMapper.deleteByPrimaryKey(petid);
        return "success:" + petid;
    }

    @Override
    public Petshow getPetInfoByPetid(Integer petid) {
        Petrelease petrelease = petreleaseMapper.selectByPrimaryKey(petid);
        Pettrading pettrading = pettradingMapper.selectByPrimaryKey(petid);
        Petdetails petdetails = petdetailsMapper.selectByPrimaryKey(petid);
        Petshow petshow = new Petshow(
                petid, petrelease.getStoreid(),
                petdetails.getPetname(), petdetails.getPetphotopath(), petdetails.getGender(), petdetails.getAge(), petdetails.getHealth(), petdetails.getSpecies(),
                petrelease.getReleasetime(), pettrading.getFlag(), pettrading.getMoney());
        return petshow;
    }

    @Override
    public List<Petshow> getAllPetInfoNotBuy(String storeid) {
        List<Pettrading> pettradingList = pettradingMapper.selectAllNotBuy(0, 100);

        List<Petshow> petshowList = new ArrayList<>();
        for (Pettrading pettrading : pettradingList) {
            /*debug*/

            int petid = pettrading.getPetid();
            Petdetails petdetails = petdetailsMapper.selectByPrimaryKey(petid);
            Petrelease petrelease = petreleaseMapper.selectByPrimaryKey(petid);

            /*java.lang.NullPointerException*/

            /*不要自己店里的。[不是自己店里的。]*/
            if (!petrelease.getStoreid().equals(storeid)) {
                petshowList.add(new Petshow(
                        petid, petrelease.getStoreid(),
                        petdetails.getPetname(), petdetails.getPetphotopath(), petdetails.getGender(), petdetails.getAge(), petdetails.getHealth(), petdetails.getSpecies(),
                        petrelease.getReleasetime(), pettrading.getFlag(), pettrading.getMoney()));
            }
        }
        return petshowList;
    }

    @Override
    public String petselling(String buyerid, int petid) {
        /*这个可以用来更新相应的列。【改变+插入记录。】（也可以触发器？？？）（需要petid）*/
        int i = pettradingMapper.updateByPrimaryKeySelective(new Pettrading(petid, true));
        /*这个需要构造函数。【】（需要买者信息）*/
        int j = pettradinglistMapper.insertSelective(new pettradinglist(buyerid, petid));
        return "success:" + i + "&" + j;
    }

    @Override
    public String petchangeInfo(int petid, String petname, String petphotopath, String health, int money) {
        int i = petdetailsMapper.updateByPrimaryKeySelective(new Petdetails(petid, petname, petphotopath, health));
        int j = pettradingMapper.updateByPrimaryKeySelective(new Pettrading(petid, money));
        return "success:" + i + "&" + j;
    }

    @Override
    public Map<String, Object> searchpet(int petid, String petname, boolean gender, int age, String species, int money,int page) {
        /*根据这些参数搜索？【写一个。】*/
        /*可是需要？糅合以及分情况？【自己写Mapper？任意一个？】*/
        PageHelper.startPage(page,5);/*页码+条数（写死？）。*/
        List<Petrelease> petreleaseList = petreleaseMapper.selectBySearch(petid, petname, gender, age, species, money);
        /*基本和那个一样，其他模仿赋值即可。或者封装相同部分。调用即复制。*/

        return petInfo(petreleaseList,page);
    }


}